package com.lqk.observer.improve;

/**
 * @author lqk
 * @date 2021/12/10 11:19
 *
 * 观察者模式原理
 *   观察者模式类似订牛奶业务
 *      1) 奶站/气象局：Subject
 *      2) 用户/第三方网站：Observer
 *   Subject：登记注册、移除和通知
 *      1) registerObserver 注册
 *      2) removeObserver 移除
 *      3) notifyObservers() 通知所有的注册的用户，根据不同需求，可以是更新数据，让用
 *      户来取，也可能是实施推送，看具体需求定
 *  Observer：接收输入
 *   观察者模式：对象之间多对一依赖的一种设计方案，被依赖的对象为Subject，
 *      依赖的对象为Observer，Subject通知Observer变化,比如这里的奶站是
 *      Subject，是1的一方。用户时Observer，是多的一方。
 *
 * 观察者模式的好处
 *  1) 观察者模式设计后，会以集合的方式来管理用户(Observer)，包括注册，移除
 *  和通知。
 *  2) 这样，我们增加观察者(这里可以理解成一个新的公告板)，就不需要去修改核
 *  心类WeatherData不会修改代码，遵守了ocp原则。
 */
public class Client {
    public static void main(String[] args) {
        // 创建一个 WeatherData
        WeatherData weatherData = new WeatherData();

        // 创建观察者
        CurrentConditions currentConditions = new CurrentConditions();
        Baidu baidu = new Baidu();

        // 将观察者注册到 weatherData
        weatherData.registerObserver(currentConditions);
        weatherData.registerObserver(baidu);

        // 测试
        System.out.println("通知各个注册的观察者，看看信息");
        weatherData.setData(10f,100f,30.3f);
    }
}
